package traitements;

import bdd.QueriesClients;
import beans.CliClients;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author CDI215
 */
public class Connexion {

    private static final String CHAMP_LOGIN = "email";
    private static final String CHAMP_MDP = "mdp";
    private Map<String, String> erreurs = new HashMap<String, String>();
    private String resultat;
    private ArrayList<CliClients> liste;

    public Map<String, String> getErreurs() {
        return erreurs;
    }

    public String getResultat() {
        return resultat;
    }

    /*
     * Méthode de connexion : création d'un objet client si login & MDP Ok.
     */
    public CliClients ConnecterCli(HttpServletRequest request) {

        CliClients client = new CliClients();
        String login = getValeurChamp(request, CHAMP_LOGIN);
        String mdp = getValeurChamp(request, CHAMP_MDP);

        try {
            QueriesClients tmp = new QueriesClients();
            liste = tmp.listerClients();
            int idLogin = -1;
            int idMdp = -1;
            try {
                idLogin = validerLogin(liste, login);
            } catch (Exception ex) {
                setErreur(CHAMP_LOGIN, ex.getMessage());
            }

            if (idLogin > -1) {
                try {
                    idMdp = validerMdp(liste, mdp, idLogin);
                } catch (Exception ex) {
                    setErreur(CHAMP_MDP, ex.getMessage());;
                }
                if ((idMdp > -1)) {
                    client = (CliClients) liste.get(idMdp);
                } else {
                    client.setCliLogin(login);
                }
            } else {
                client.setCliLogin(login);
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Connexion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Connexion.class.getName()).log(Level.SEVERE, null, ex);
        }
        return client;
    }

    /*
     * Méthode de login auto, sur ID du Cookie.
     * A refaire sur la base d'une PS paramétré...
     */
    public CliClients autoConnect(int id) {
        CliClients client = null;
        try {
            QueriesClients tmp = new QueriesClients();
            client = tmp.listerUnClient(id);
                     

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Connexion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Connexion.class.getName()).log(Level.SEVERE, null, ex);
        }
        return client;
    }

    private int validerLogin(ArrayList liste, String login) throws Exception {
        int id = -1;
        if (login == null) {
            throw new Exception("Entrez votre adresse mail !");
        } else {
            boolean flag = false;
            for (int i = 0; i < liste.size(); i++) {
                if (((CliClients) (liste.get(i))).getCliLogin().equalsIgnoreCase(login)) {
                    if (((CliClients) (liste.get(i))).isCliActif()) {
                        flag = true;
                        id = i;
                    } else {
                        throw new Exception("Ce compte est désactivé !");
                    }
                }
            }
            if (!flag) {
                throw new Exception("Erreur de login !");
            }

        }
        return id;
    }

    private int validerMdp(ArrayList liste, String mdp, int id1) throws Exception {
        int id = -1;
        if (mdp == null) {
            throw new Exception("Entrez votre mot de passe !");
        } else {
            boolean flag = false;
            if (((CliClients) (liste.get(id1))).getCliMdp().equalsIgnoreCase(mdp)) {
                flag = true;
                id = id1;
            }
            if (!flag) {
                throw new Exception("Mot de passe incorrect !");
            }
        }
        return id;
    }

    /*
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     */
    private void setErreur(String champ, String message) {
        erreurs.put(champ, message);
    }

    /*
     * Méthode utilitaire qui retourne null si un champ est vide, et son contenu
     * sinon.
     */
    private static String getValeurChamp(HttpServletRequest request, String nomChamp) {
        String valeur = request.getParameter(nomChamp);
        if (valeur == null || valeur.trim().length() == 0) {
            return null;
        } else {
            return valeur;
        }
    }
}
